package com.xiangxg.jvm.classloader;

/*
 当前类加载器（Current Classloader）

 每个类都会使用自己的类加载器（即加载自身的类加载器）来去加载其他类（指的是所依赖的类），
 如果classX引用了classY,那么classX的类加载器就会加载CLASSY（前提是ClassY尚未被加载）

 线程上下文类加载器（Context Classloader）
 类Thread中的getContextClassLoader与setContextClassLoader
 分别用来获取和设置上下文类加载器

 如果没有通过setContextClassLoader进行设置的话，线程将继承其父线程的上下文类加载器
 Java应用运行时的初始线程的上下文类加载器是系统类加载器。在线程中运行的代码可以通过该类加载器来加载类与资源

 线程上下文类加载器的重要性：

 SPI (Service Provider Interface)
 父ClassLoader可以使用当前线程Thread.currentThread().getContextLoader所指定的class
 loader加载类。
 这就改变了父类加载器不能使用子类加载器或者是其他没有直接父子关系的ClassLoader加载的类的情况
 ，即改变了双亲委托模型。

 线程上下文类加载器就是当前线和的current classloader.

 在双亲委托模型下，类加载是由下至上，即下层的类加载 器会委托上层进行加载。但是对于SPI
 来说，有些接口是JAVA核心库所提供的。而java核心库是由启动类加载器加载的，而这些接口的实现却
 来自于不同的jar包，java的启动类加载器是不会加载其他来源的jar包，这样传统的双亲委托模型就无法
 满足SPI的要求。而通过给当前线程设置上下文类加载器，就可以设置上下文类加载器来实现对于接口实现类的加载


 */
public class MyTest24 {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getContextClassLoader());
        System.out.println(Thread.class.getClassLoader());
    }
}
